﻿using Avalonia.Controls;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using 畜牧业审核程序国产.Models;
using Microsoft.Data.Sqlite;
using CommunityToolkit.Mvvm.ComponentModel;
using MsBox.Avalonia.Enums;
using Nlnet.Avalonia.Controls;
using 畜牧业审核程序国产.Models.ToolsClass;

namespace 畜牧业审核程序国产.ViewModels
{
    internal class PasteDataFromStatsCloudViewModel : ViewModelBase
    {
        private string _txtPaste;

        public string TxtPaste
        {
            get { return _txtPaste; }
            set => SetProperty(ref _txtPaste, value);
        }
        public RelayCommand ComfirmCommand { get; private set; }
        public RelayCommand AppendCommand { get; private set; }
        public PasteDataFromStatsCloudViewModel()
        {
            this.ComfirmCommand = new RelayCommand(async () => {await ImportPaste(); });
            this.AppendCommand = new RelayCommand(async ()=>await AppendPasteToSqlite());
            WeakReferenceMessenger.Default.Register<TransmitView>(this, OnMyMessageReceived);
        }

        private void OnMyMessageReceived(object recipient, TransmitView transmitView)
        {
            if (transmitView.TransmitedWindow is PasteDataFromStatsCloud)
            {
                this.thisView = transmitView.TransmitedWindow as PasteDataFromStatsCloud;
            }
        }

        public PasteDataFromStatsCloud thisView { get; set; }


        private async Task ImportPaste()
        {
            //await PasteToSqlite. ImportPasteToSqlite(this.thisView);
            //await MyMessagebox.ShowAsync("导入成功", thisView);
            //this.TxtPaste = string.Empty;

            MyProgressBar _progressBar = new MyProgressBar();
            _progressBar.Show();
            var progress = new Progress<int>(value => _progressBar.UpdateProgress(value));
            FuncOutCome funcOutCome = await Task.Run(()=> PasteToSqlite.ImportPasteToSqlite(progress));
            _progressBar.Close();
            if (funcOutCome.FuncOutComeInfoArgs ==null)
            {
                //设置平台
                //Global.SetPlatform();
                await MyMessagebox.ShowAsync("粘贴到本地数据库成功!", this.thisView,Icon.Success,ButtonEnum.Ok);
                //MyMessage msg1 = new MyMessage("Reload");
                //WeakReferenceMessenger.Default.Send(msg1);
            }
            else
            {
                this.TxtPaste = funcOutCome.FuncOutComeInfoArgs;
                await MyMessagebox.ShowAsync($"粘贴过程出错,错误内容请看文本框", thisView,funcOutCome.Icon,ButtonEnum.Ok);
            }
            //this.TxtPaste = string.Empty;
        }
        private async Task AppendPasteToSqlite()
        {
            MyProgressBar _progressBar = new MyProgressBar();
            _progressBar.Show();
            var progress = new Progress<int>(value => _progressBar.UpdateProgress(value));
            FuncOutCome funcOutCome = await Task.Run(() => PasteToSqlite.AppendPasteToSqlite(progress));
            _progressBar.Close();
            if (funcOutCome.FuncOutComeInfoArgs ==null)
            {
                //设置平台
               // Global.SetPlatform();
                await MyMessagebox.ShowAsync("追加到本地数据库成功!", this.thisView, Icon.Success,ButtonEnum.Ok);
                //MyMessage msg1 = new MyMessage("Reload");
                //WeakReferenceMessenger.Default.Send(msg1);
            }
            else
            {
                this.TxtPaste = funcOutCome.FuncOutComeInfoArgs;
                await MyMessagebox.ShowAsync($"追加过程出错,错误内容为请看文本框", thisView, funcOutCome.Icon,ButtonEnum.Ok);
            }
           // this.TxtPaste = string.Empty;

        }

    }
    //    在使用 MVVM 架构时，应该尽量将视图逻辑（例如弹窗提示）与业务逻辑分离。根据你提供的场景，建议在 ViewModel 中实现弹窗逻辑，而不是在 Model 的方法 B 中。这样可以保持代码的清晰和可维护性，同时符合 MVVM 的设计理念。

    //实现思路
    //错误处理：在 Model 的方法 B 中，捕获异常或判断错误的条件，并返回相应的 FuncOutCome 结果。
    //弹窗逻辑：在 ViewModel 的方法 A 中，根据方法 B 返回的 FuncOutCome结果判断是否需要弹出提示框，并在必要时显示弹窗。
    //实现步骤
    //1. 修改 Model 中的 B 方法
    //保持你的方法 B 只返回 FuncOutCome，用于执行核心逻辑并捕获错误。

    //public class Model
    //    {
    //        public FuncOutCome MethodB()
    //        {
    //            var result = new FuncOutCome();
    //            try
    //            {
    //                // 模拟核心逻辑
    //                // 如果业务逻辑出错，设置 result.IsFuncSuccess 为 false
    //                // result.FuncOutComeInfoArgs = "出错信息";
    //                // result.SomeOtherInfo = "其他信息";

    //                // 假设执行成功
    //                result.IsFuncSuccess = true;
    //                return result;
    //            }
    //            catch (Exception ex)
    //            {
    //                result.IsFuncSuccess = false;
    //                result.FuncOutComeInfoArgs = ex.Message; // 捕获错误信息
    //                return result;
    //            }
    //        }
    //    }
    //2. 在 ViewModel 的 A 方法中实现弹窗逻辑
    //在 ViewModel 的方法 A 中，调用方法 B，并根据返回结果决定是否弹出提示框。

    //using CommunityToolkit.Mvvm.ComponentModel;
    //using System.Windows;

    //public class MyViewModel : ObservableObject
    //    {
    //        private readonly Model _model;

    //        public MyViewModel()
    //        {
    //            _model = new Model();
    //        }

    //        public void MethodA()
    //        {
    //            for (int i = 0; i < 10; i++) // 假设循环10次
    //            {
    //                var outcome = _model.MethodB();
    //                if (!outcome.IsFuncSuccess)
    //                {
    //                    // 如果出错，弹窗提示并终止循环
    //                    MessageBox.Show(outcome.FuncOutComeInfoArgs, "错误", MessageBoxButton.OK, MessageBoxImage.Error);
    //                    break; // 终止循环
    //                }
    //            }
    //        }
    //    }
    //    关键点
    //    弹窗逻辑放在 ViewModel：这样可以保持业务逻辑和视图逻辑的分离，符合 MVVM 模式。
    //业务逻辑独立：Model 的方法 B 只负责逻辑处理和错误返回，不负责 UI 交互，减少了对 UI 的直接依赖。
    //维护性：这种结构使得代码更容易维护和扩展，后期如果需要修改弹窗逻辑或更改 UI 交互，只需调整 ViewModel 中的实现，而不需要改动底层业务逻辑。
    //总结
    //在 MVVM 模式下，建议将弹窗逻辑放在 ViewModel 的方法实现中，而将 Model 的方法的核心逻辑保持独立。
}
